]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
gnome-shell-plugin: Port event filter to XInput2
authorJasper St. Pierre <jstpierre@mecheye.net>
Fri, 21 Dec 2012 02:34:59 +0000 (21:34 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Wed, 2 Jan 2013 18:43:06 +0000 (13:43 -0500)
Otherwise, we'll see issues with tray icons.

https://bugzilla.gnome.org/show_bug.cgi?id=690590

src/gnome-shell-plugin.c

index 4c72e14faa7cbe20d558764e53eb0fe06dee5643..46da710ebfdc046dbd56c336793521bbb1bbe227 100644 (file)
@@ -286,18 +286,18 @@ gnome_shell_plugin_kill_switch_workspace (MetaPlugin         *plugin)
 
 static gboolean
 ignore_crossing_event (MetaPlugin   *plugin,
-                       XEvent       *xev)
+                       XIEnterEvent *enter_event)
 {
   MetaScreen *screen = meta_plugin_get_screen (plugin);
   ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
 
-  if (xev->xcrossing.window == clutter_x11_get_stage_window (stage))
+  if (enter_event->event == clutter_x11_get_stage_window (stage))
     {
       /* If the pointer enters a child of the stage window (eg, a
        * trayicon), we want to consider it to still be in the stage,
        * so don't let Clutter see the event.
        */
-      if (xev->xcrossing.detail == NotifyInferior)
+      if (enter_event->detail == XINotifyInferior)
         return TRUE;
 
       /* If the pointer is grabbed by a window it is not currently in,
@@ -307,9 +307,9 @@ ignore_crossing_event (MetaPlugin   *plugin,
        * out of sync, but that happens fairly often with grabs, and we
        * can work around it. (Eg, shell_global_sync_pointer().)
        */
-      if (xev->xcrossing.mode == NotifyGrab &&
-          (xev->xcrossing.detail == NotifyNonlinear ||
-           xev->xcrossing.detail == NotifyNonlinearVirtual))
+      if (enter_event->mode == XINotifyGrab &&
+          (enter_event->detail == XINotifyNonlinear ||
+           enter_event->detail == XINotifyNonlinearVirtual))
         return TRUE;
     }
 
@@ -320,6 +320,9 @@ static gboolean
 gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
                                   XEvent     *xev)
 {
+  MetaScreen *screen = meta_plugin_get_screen (plugin);
+  MetaDisplay *display = meta_screen_get_display (screen);
+
   GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin);
 #ifdef GLX_INTEL_swap_event
   if (shell_plugin->have_swap_event &&
@@ -341,9 +344,14 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
   /* Make sure that Clutter doesn't see certain focus change events,
    * so that when we're moving into something like a tray icon, we
    * don't unfocus the container. */
-  if ((xev->xany.type == EnterNotify || xev->xany.type == LeaveNotify) &&
-      ignore_crossing_event (plugin, xev))
-    return TRUE;
+  if (xev->type == GenericEvent &&
+      xev->xcookie.extension == meta_display_get_xinput_opcode (display))
+    {
+      XIEvent *input_event = (XIEvent *) xev->xcookie.data;
+      if ((input_event->evtype == XI_Enter || input_event->evtype == XI_Leave) &&
+          ignore_crossing_event (plugin, (XIEnterEvent *) input_event))
+        return TRUE;
+    }
 
   /*
    * Pass the event to shell-global